home *** CD-ROM | disk | FTP | other *** search
/ Experimental BBS Explossion 3 / Experimental BBS Explossion III.iso / gus / vts139b.zip / VTCMD.PAS < prev    next >
Pascal/Delphi Source File  |  1993-12-22  |  10KB  |  509 lines

  1. UNIT VTCmd;
  2.  
  3. INTERFACE
  4.  
  5. USES Dos, Objects,
  6.      SoundDevices, DevGus,
  7.      CmdLine;
  8.  
  9.  
  10.  
  11.  
  12. TYPE
  13.   TDoOneProc = FUNCTION(FName, InsidePath: PathStr) : BOOLEAN;
  14.  
  15. CONST
  16.   OneModPtr  : POINTER = NIL;
  17. VAR
  18.   OneMODProc : TDoOneProc ABSOLUTE OneModPtr;
  19.  
  20. TYPE
  21.   TCmdOptions =
  22.     RECORD
  23.       LowQuality : BOOLEAN;
  24.       DevID      : TDevID;
  25.       Freq       : WORD;
  26.       Volume     : WORD;
  27.     END;
  28.  
  29.   TVTCmdSwitch =
  30.     OBJECT(TCmdLineInterpreter)
  31.       PROCEDURE CmdInitShell     (Shell: STRING);        VIRTUAL;
  32.       PROCEDURE InterpretSwitch  (Token: TCmdLine);      VIRTUAL;
  33.       PROCEDURE GetCmdOptions    (VAR Opt: TCmdOptions); VIRTUAL;
  34.       PROCEDURE SetCmdOptions    (VAR Opt: TCmdOptions); VIRTUAL;
  35.     END;
  36.  
  37.   TVTCmd =
  38.     OBJECT(TVTCmdSwitch)
  39.       PROCEDURE InterpretNoSwitch(Token: TCmdLine); VIRTUAL;
  40.     END;
  41.  
  42. VAR
  43.   Cmd      : TVTCmd;
  44.   SongColl : TStringCollection;
  45.  
  46.  
  47.  
  48.  
  49. PROCEDURE SetVTFreq;
  50. PROCEDURE SetVTDevice;
  51.  
  52. FUNCTION DoSongColl(Path: PathStr) : BOOLEAN;
  53.  
  54.  
  55.  
  56.  
  57. IMPLEMENTATION
  58.  
  59. USES VTGlobal, VTScreens,
  60.      SongUnit, SongElements,
  61.      PlayMod, SoundBlaster, Gus,
  62.      FileUtil;
  63.  
  64.  
  65.  
  66.  
  67. { -------------------------------------------------------------------------- }
  68.  
  69. CONST
  70.   DeviceSet : BOOLEAN = FALSE;
  71.  
  72. PROCEDURE SetVTDevice;
  73.   BEGIN
  74.     IF DeviceSet THEN EXIT;
  75.  
  76.     DevPtr := LocateDevice(DevID);
  77.  
  78.     UsingGUS := FALSE;
  79.  
  80.     IF (DevPtr = NIL) OR NOT DevPtr^.Autodetect THEN
  81.       DevPtr := LocateDevice(GUSDevID);
  82.  
  83.     SetDevice(DevPtr);
  84.   END;
  85.  
  86.  
  87. PROCEDURE SetVTFreq;
  88.   BEGIN
  89.     ChangeSamplingRate(DesiredHz);
  90.   END;
  91.  
  92. { -------------------------------------------------------------------------- }
  93.  
  94. FUNCTION DoAllMODs(DefaultPath: PathStr; Path: PathStr; DoOne: TDoOneProc) : BOOLEAN;
  95.   CONST
  96.     NumExts = 6;
  97.     Exts : ARRAY[0..NumExts] OF ExtStr =
  98.       (
  99.         '.123',
  100.  
  101.         '.MOD', '.STX', '.WOW', '.OKT', '.S?M', '.669'
  102.       );
  103.  
  104.     Dirs : ARRAY[0..3] OF PathStr =
  105.       (
  106.         '',
  107.         '',
  108.         '',
  109.         ''
  110.       );
  111.   VAR
  112.     InsidePath : PathStr;
  113.     Dir        : DirStr;
  114.     Name       : NameStr;
  115.     Ext        : ExtStr;
  116.     DirIdx,
  117.     DirF,
  118.     DirL       : WORD;
  119.     ExtF,
  120.     ExtL       : WORD;
  121.     i, j       : WORD;
  122.     SearchR    : SearchRec;
  123.   LABEL
  124.     Sigue;
  125.   BEGIN
  126.     DoAllMODs := TRUE;
  127.  
  128.     i := Pos('/', Path);
  129.     IF i > 0 THEN
  130.       BEGIN
  131.         InsidePath := Copy(Path, i+1, 255);
  132.         Path       := Copy(Path, 1,   i-1);
  133.       END
  134.     ELSE
  135.       InsidePath := '';
  136.  
  137.     FSplit(Path, Dir, Name, Ext);
  138.     IF Dir <> '' THEN
  139.       BEGIN
  140.         Dirs[0] := FExpand(Dir);
  141.         AddBar2Path(Dirs[0]);
  142.         DirF    := 0;
  143.         DirL    := 0;
  144.       END
  145.     ELSE
  146.       BEGIN
  147.         Dirs[3] := FExpand(ModPath);
  148.         AddBar2Path(Dirs[3]);
  149.  
  150.         DefaultPath := FExpand(DefaultPath);
  151.         AddBar2Path(DefaultPath);
  152.         Dirs[1] := DefaultPath;
  153.  
  154.         DirF := 1;
  155.         DirL := 3;
  156.       END;
  157.  
  158.     Path := FExpand(Path);
  159.     FSplit(Path, Dir, Name, Ext);
  160.  
  161.     IF DirF > 0 THEN
  162.       BEGIN
  163.         Dirs[2] := Dir;
  164.  
  165.         FOR DirIdx := DirL DOWNTO 2 DO
  166.           BEGIN
  167.             FOR i := DirF TO DirIdx - 1 DO
  168.               IF Dirs[DirIdx] = Dirs[i] THEN
  169.                 BEGIN
  170.                   FOR i := DirIdx TO DirL - 1 DO
  171.                     Dirs[i] := Dirs[i+1];
  172.                   DEC(DirL);
  173.                   GOTO Sigue;
  174.                 END;
  175. Sigue:
  176.           END;
  177.       END;
  178.  
  179.  
  180.     IF Ext <> '' THEN
  181.       BEGIN
  182.         Exts[0] := Ext;
  183.         ExtF    := 0;
  184.         ExtL    := 0;
  185.       END
  186.     ELSE
  187.       BEGIN
  188.         ExtF := 1;
  189.         ExtL := NumExts;
  190.       END;
  191.  
  192.     Path := Dir + Name;
  193.  
  194.  
  195.  
  196.     { Loop for all MODs. }
  197.  
  198.     DoAllMODs := FALSE;
  199.  
  200.     FOR j := DirF TO DirL DO
  201.       FOR i := ExtF TO ExtL DO
  202.         BEGIN
  203.           FindFirst(Dirs[j]+Name+Exts[i], ReadOnly, SearchR);
  204.  
  205.           WHILE DosError = 0 DO
  206.             BEGIN
  207.               IF NOT DoOne(Dirs[j] + SearchR.Name, InsidePath) THEN EXIT;
  208.  
  209.               FindNext(SearchR);
  210.             END;
  211.         END;
  212.  
  213.     DoAllMODs := TRUE;
  214.   END;
  215.  
  216.  
  217. { -------------------------------------------------------------------------- }
  218.  
  219.  
  220.  
  221.  
  222. PROCEDURE CmdInitDevice(s: STRING);
  223.   BEGIN
  224.     IF s = '' THEN EXIT;
  225.  
  226.     DevID := s;
  227.  
  228.     SetVTDevice;
  229.   END;
  230.  
  231.  
  232.  
  233.  
  234. PROCEDURE CmdInitFreq(s: STRING);
  235.   VAR
  236.     i, r : WORD;
  237.   BEGIN
  238.     IF s = '' THEN EXIT;
  239.  
  240.     VAL(s, i, r);
  241.     VAL(s, i, r);
  242.     IF r = 0 THEN
  243.       DesiredHz := i;
  244.   END;
  245.  
  246.  
  247.  
  248.  
  249. PROCEDURE CmdInitVolume(s: STRING);
  250.   VAR
  251.     i, r : WORD;
  252.   BEGIN
  253.     IF s = '' THEN EXIT;
  254.  
  255.     VAL(s, i, r);
  256.     IF r = 0 THEN
  257.       BEGIN
  258.         IF i > 255 THEN i := 255;
  259.         VTVolume := i;
  260.       END;
  261.   END;
  262.  
  263. PROCEDURE CmdLoopMod(f: BOOLEAN);
  264.   BEGIN
  265.     VTLoopMod := f;
  266.   END;
  267.  
  268.  
  269. PROCEDURE CmdForceLoop(f: BOOLEAN);
  270.   BEGIN
  271.     ForceLoopMod := f;
  272.   END;
  273.  
  274.  
  275. PROCEDURE CmdLowQuality(f: BOOLEAN);
  276.   BEGIN
  277.     LowQuality := f;
  278.   END;
  279.  
  280.  
  281. PROCEDURE CmdBassFilter(f: BOOLEAN);
  282.   BEGIN
  283.     DoBassPower := f;
  284.   END;
  285.  
  286.  
  287. PROCEDURE CmdInit1stSong(s: STRING);
  288.   VAR
  289.     i : WORD;
  290.   BEGIN
  291.     FOR i := 1 TO Length(s) DO
  292.       s[i] := UpCase(s[i]);
  293.  
  294.     FirstSong := s;
  295.   END;
  296.  
  297.  
  298. PROCEDURE CmdInit1stPattern (s: STRING);
  299.   VAR
  300.     i, r : WORD;
  301.   BEGIN
  302.     IF s = '' THEN EXIT;
  303.  
  304.     VAL(s, i, r);
  305.     IF r = 0 THEN
  306.       VT1stPattern := i;
  307.   END;
  308.  
  309.  
  310. PROCEDURE CmdInitSongLen    (s: STRING);
  311.   VAR
  312.     i, r : WORD;
  313.   BEGIN
  314.     IF s = '' THEN EXIT;
  315.  
  316.     VAL(s, i, r);
  317.     IF r = 0 THEN
  318.       VTSongLen := i;
  319.   END;
  320.  
  321.  
  322. PROCEDURE CmdInitRepStart   (s: STRING);
  323.   VAR
  324.     i, r : WORD;
  325.   BEGIN
  326.     IF s = '' THEN EXIT;
  327.  
  328.     VAL(s, i, r);
  329.     IF r = 0 THEN
  330.       VTRepStart := i;
  331.   END;
  332.  
  333.  
  334. PROCEDURE CmdSetPort(s: STRING);
  335.   VAR
  336.     i, r : WORD;
  337.   BEGIN
  338.     IF s = '' THEN EXIT;
  339.  
  340.     VAL(s, i, r);
  341.     IF r = 0 THEN
  342.       BEGIN
  343.         SbPort  := i;
  344.         GusPort := i;
  345.       END;
  346.   END;
  347.  
  348.  
  349. PROCEDURE CmdSetIRQ(s: STRING);
  350.   VAR
  351.     i, r : WORD;
  352.   BEGIN
  353.     IF s = '' THEN EXIT;
  354.  
  355.     VAL(s, i, r);
  356.     IF r = 0 THEN
  357.       BEGIN
  358.         SbIRQ  := i;
  359.         GusIrq := i;
  360.       END;
  361.   END;
  362.  
  363.  
  364. PROCEDURE CmdSetDMA(s: STRING);
  365.   VAR
  366.     i, r : WORD;
  367.   BEGIN
  368.     IF s = '' THEN EXIT;
  369.  
  370.     VAL(s, i, r);
  371.     IF r = 0 THEN
  372.       SbDMAChan := i;
  373.   END;
  374.  
  375.  
  376.  
  377.  
  378. PROCEDURE CmdModOffset(s: STRING);
  379.   VAR
  380.     l : LONGINT;
  381.     r : WORD;
  382.   BEGIN
  383.     IF s = '' THEN EXIT;
  384.  
  385.     VAL(s, l, r);
  386.     IF r = 0 THEN
  387.       ModOffset := l;
  388.   END;
  389.  
  390.  
  391.  
  392.  
  393. (*
  394.   { Read and initialize Sound Blaster timeout value from command line. }
  395.  
  396.   IF ParamStr(4) <> '' THEN BEGIN
  397.     VAL(ParamStr(4), i, r);
  398.     SbSplTimeout := i;
  399.   END;
  400.  
  401.  
  402.  
  403.   { Read and initialize Sound Blaster IRQ value from command line. }
  404.  
  405.   IF ParamStr(5) <> '' THEN BEGIN
  406.     VAL(ParamStr(5), i, r);
  407.     SbIrq := i;
  408.   END;
  409. *)
  410.  
  411.  
  412.  
  413.  
  414. FUNCTION DoSongColl(Path: PathStr) : BOOLEAN;
  415.   VAR
  416.     i : WORD;
  417.   LABEL
  418.     Fin;
  419.   BEGIN
  420.     DoSongColl := TRUE;
  421.     IF SongColl.Count = 0 THEN EXIT;
  422.  
  423.     DoSongColl := FALSE;
  424.     FOR i := 0 TO SongColl.Count - 1 DO
  425.       IF NOT DoAllMODs(Path, PString(SongColl.At(i))^, OneMODProc) THEN GOTO Fin;
  426.     DoSongColl := TRUE;
  427.  
  428. Fin:
  429.     SongColl.FreeAll;
  430.   END;
  431.  
  432.  
  433.  
  434.  
  435. PROCEDURE TVTCmd.InterpretNoSwitch(Token: TCmdLine);
  436.   BEGIN
  437.     SongColl.AtInsert(SongColl.Count, NewStr(Token));
  438.   END;
  439.  
  440.  
  441. PROCEDURE TVTCmdSwitch.CmdInitShell(Shell: STRING);
  442.   VAR
  443.     i, r : WORD;
  444.   BEGIN
  445.     ShellPath  := Shell;
  446.     ShellParam := Copy(Line, Idx, 255);
  447.   END;
  448.  
  449.  
  450. PROCEDURE TVTCmdSwitch.InterpretSwitch  (Token: TCmdLine);
  451.   BEGIN
  452.  
  453.     IF      Token = ''               THEN BEGIN IF NOT DoSongColl(FileDir) THEN Abort; END
  454.     ELSE IF CmpSwitch(Token, 'nobf') THEN CmdBassFilter     (FALSE)
  455.     ELSE IF CmpSwitch(Token, 'bfil') THEN CmdBassFilter     (TRUE)
  456.     ELSE IF CmpSwitch(Token, 'nolp') THEN CmdLoopMod        (FALSE)
  457.     ELSE IF CmpSwitch(Token, 'loop') THEN CmdLoopMod        (TRUE)
  458.     ELSE IF CmpSwitch(Token, 'nofl') THEN CmdForceLoop      (FALSE)
  459.     ELSE IF CmpSwitch(Token, 'frst') THEN CmdInit1stSong    (TokenParam(Token))
  460.     ELSE IF CmpSwitch(Token, 'port') THEN CmdSetPort        (TokenParam(Token))
  461.     ELSE IF CmpSwitch(Token, 'irq' ) THEN CmdSetIRQ         (TokenParam(Token))
  462.     ELSE IF CmpSwitch(Token, 'dma' ) THEN CmdSetDMA         (TokenParam(Token))
  463.     ELSE IF CmpSwitch(Token, 'off' ) THEN CmdModOffset      (TokenParam(Token))
  464.     ELSE IF CmpSwitch(Token, 'flp' ) THEN CmdForceLoop      (TRUE)
  465.     ELSE IF CmpSwitch(Token, 'lq'  ) THEN CmdLowQuality     (TRUE)
  466.     ELSE IF CmpSwitch(Token, 'hq'  ) THEN CmdLowQuality     (FALSE)
  467.     ELSE IF CmpSwitch(Token, 'ss'  ) THEN CmdInit1stPattern (TokenParam(Token))
  468.     ELSE IF CmpSwitch(Token, 'sl'  ) THEN CmdInitSongLen    (TokenParam(Token))
  469.     ELSE IF CmpSwitch(Token, 'sr'  ) THEN CmdInitRepStart   (TokenParam(Token))
  470.     ELSE IF CmpSwitch(Token, 'sh'  ) THEN CmdInitShell      (TokenParam(Token))
  471.     ELSE IF CmpSwitch(Token, 'd'   ) THEN CmdInitDevice     (TokenParam(Token))
  472.     ELSE IF CmpSwitch(Token, 'f'   ) THEN CmdInitFreq       (TokenParam(Token))
  473.     ELSE IF CmpSwitch(Token, 'v'   ) THEN CmdInitVolume     (TokenParam(Token))
  474.     ;
  475.  
  476.   END;
  477.  
  478.  
  479. PROCEDURE TVTCmdSwitch.GetCmdOptions(VAR Opt: TCmdOptions);
  480.   BEGIN
  481.     Opt.LowQuality := LowQuality;
  482.     Opt.DevID      := DevID;
  483.     Opt.Freq       := DesiredHz;
  484.     Opt.Volume     := VTVolume;
  485.  
  486.     SetVTDevice;
  487.   END;
  488.  
  489.  
  490. PROCEDURE TVTCmdSwitch.SetCmdOptions(VAR Opt: TCmdOptions);
  491.   BEGIN
  492.     LowQuality := Opt.LowQuality;
  493.     DevID      := Opt.DevID;
  494.     DesiredHz  := Opt.Freq;
  495.     VTVolume   := Opt.Volume;
  496.  
  497.     SetVTDevice;
  498.   END;
  499.  
  500.  
  501.  
  502.  
  503.  
  504.  
  505.  
  506.  
  507.  
  508. END.
  509.